//
//  NSString+Emoji.m
//  SharedGym
//
//  Created by Jiang on 2017/5/4.
//
//

#import "NSString+Utility.h"
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (Utility)
- (NSURL *)URL{
    return [NSURL URLWithString:self];
}
- (NSString *)localized{
    return NSLocalizedString(self, nil);
}

- (NSMutableString *)MD5{
    //MD5加密都是通过C级别的函数来计算，所以需要将加密的字符串转换为C语言的字符串
    const char *cString = self.UTF8String;
    //创建一个C语言的字符数组，用来接收加密结束之后的字符
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    //MD5计算（也就是加密）
    //第一个参数：需要加密的字符串
    //第二个参数：需要加密的字符串的长度
    //第三个参数：加密完成之后的字符串存储的地方
    CC_MD5(cString, (CC_LONG)strlen(cString), result);
    //将加密完成的字符拼接起来使用（16进制的）。
    //声明一个可变字符串类型，用来拼接转换好的字符
    NSMutableString *resultString = [[NSMutableString alloc]init];
    //遍历所有的result数组，取出所有的字符来拼接
    for (int i = 0;i < CC_MD5_DIGEST_LENGTH; i++) {
        [resultString  appendFormat:@"%02x",result[i]];
        //%02x：x 表示以十六进制形式输出，02 表示不足两位，前面补0输出；超出两位，不影响。当x小写的时候，返回的密文中的字母就是小写的，当X大写的时候返回的密文中的字母是大写的。
    }
    return resultString;
}
- (NSString *)stringByStrip:(char)symbol{
    const char *chrs = [self UTF8String];
    int left = 0 , right = (int)self.length - 1;
    for (int i = 0; i < self.length; i++) {
        if(left == right || left > right)
            break;
        if (chrs[left] == symbol)
            left = i;
        if (chrs[right] == symbol)
            right--;
    }
    return [self substringWithRange:NSMakeRange(left, right-left+1)];
}
- (NSMutableString *)SHA1{
    const char *cstr = [self UTF8String];
    //使用对应的CC_SHA1,CC_SHA256,CC_SHA384,CC_SHA512的长度分别是20,32,48,64
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    //使用对应的CC_SHA256,CC_SHA384,CC_SHA512
    CC_SHA1(cstr, (CC_LONG)strlen(cstr), digest);
    
    NSMutableString* output = [NSMutableString string];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}
- (NSString *)base64Encode{
    //1、先转换成二进制数据
    NSData *data =[self dataUsingEncoding:NSUTF8StringEncoding];
    //2、对二进制数据进行base64编码，完成后返回字符串
    return [data base64EncodedStringWithOptions:0];
}
-(NSString *)base64Decode{
    //注意：该字符串是base64编码后的字符串
    //1、转换为二进制数据（完成了解码的过程）
    NSData *data=[[NSData alloc]initWithBase64EncodedString:self options:0];
    //2、把二进制数据转换成字符串
    return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
}
@end


